﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Model;
using Model.Models;
using Persistence;
namespace Services
{
    /// <summary>
    /// Gerencia todas as regras de negócio da entidade Empresa
    /// </summary>
    public class GerenciadorEmpresa
    {
        private IUnitOfWork unitOfWork;
        private bool shared;

        public GerenciadorEmpresa()
        {
            this.unitOfWork = new UnitOfWork();
            shared = false;
        }

        internal GerenciadorEmpresa(IUnitOfWork unitOfword)
        {
            this.unitOfWork = unitOfword;
            shared = true;
        }

        public int Inserir(EmpresaModel empresaModel)
        {
            TB_EMPRESA empresaE = new TB_EMPRESA();
            Atribuir(empresaModel, empresaE);
            unitOfWork.RepositorioEmpresa.Inserir(empresaE);
            unitOfWork.Commit(shared);
            return empresaE.id_empresa;
        }


        public void Editar(EmpresaModel empresaModel)
        {
            TB_EMPRESA empresaE = new TB_EMPRESA();
            Atribuir(empresaModel, empresaE);
            unitOfWork.RepositorioEmpresa.Editar(empresaE);
            unitOfWork.Commit(shared);
        }

        public void Remover(int idEmpresa)
        {
            unitOfWork.RepositorioEmpresa.Remover(empresa => empresa.id_empresa.Equals(idEmpresa));
            unitOfWork.Commit(shared);

        }

        private IQueryable<EmpresaModel> GetQuery()
        {
            IQueryable<TB_EMPRESA> tb_empresa = unitOfWork.RepositorioEmpresa.GetQueryable();
            var query = from empresa in tb_empresa orderby(empresa.nome)
                        select new EmpresaModel 
                        {
                            Id_Empresa = empresa.id_empresa,
                            Nome = empresa.nome,
                            RazaoSocial = empresa.razao_social,
                            Cnpj = empresa.cnpj,
                            Email = empresa.email,
                            Senha = empresa.senha,
                            Telefone = empresa.telefone,
                            Rua = empresa.rua,
                            Numero = empresa.numero,
                            Bairro = empresa.bairro,
                            Cep = empresa.cep,
                            Cidade = empresa.TB_CIDADE.nome,
                            Estado = empresa.TB_CIDADE.TB_ESTADO.nome,
                            Id_cidade = empresa.id_cidade,
                            Id_estado = empresa.TB_CIDADE.id_estado
                        };
            return query;
        }

        public IEnumerable<EmpresaModel> ObterTodos()
        {
            return GetQuery();
        }

        public EmpresaModel Obter(int idEmpresa)
        {
            IEnumerable<EmpresaModel> empresaEs = GetQuery().Where(empresaModel => empresaModel.Id_Empresa.Equals(idEmpresa));
            return empresaEs.ElementAtOrDefault(0);
        }


        private void Atribuir(EmpresaModel empresaModel, TB_EMPRESA empresaE)
        {
            empresaE.id_empresa = empresaModel.Id_Empresa;
            empresaE.nome = empresaModel.Nome;
            empresaE.razao_social = empresaModel.RazaoSocial;
            empresaE.cnpj = empresaModel.Cnpj;
            empresaE.email = empresaModel.Email;
            empresaE.senha = empresaModel.Senha;
            empresaE.telefone = empresaModel.Telefone;
            empresaE.rua = empresaModel.Rua;
            empresaE.numero = empresaModel.Numero;
            empresaE.bairro = empresaModel.Bairro;
            empresaE.cep = empresaModel.Cep;
            empresaE.id_cidade = empresaModel.Id_cidade;
        }
    }
}